


#include "..\Inc\includes.h"

/**************************************************************************
 * 函数名		：Read_ADC_10Bit()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2017-09-15
 * 函数描述 ：读ADC 采样结果
 *************************************************************************/		
unsigned int	Read_ADC_10Bit(void)
{
	unsigned int		u16_result = 0;
	
	u16_result = ADDH;
	u16_result = (u16_result<<2)+ADDL;
	
	return (u16_result);
}

/**************************************************************************
 * 函数名		：ADC_ChannelChange()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2017-09-15
 * 函数描述 ：转换AD采样通道,转把的值要做下滤波，发现会有尖峰干扰，1/8+7/8的滤波效果不明显
 *************************************************************************/	
 void ADC_ChannelChange(void)
 {
	static unsigned char			u8_sample_channel_index = 0,
														u8_handle_bar_result_count = 0;
	unsigned int							u16_handle_bar_voltage_buffer = 0;
	
	if (u8_sample_channel_index==0)																													//保存转把采样结果
	{
#if 0		
//		
		U16_HandleBarBuffer[u8_handle_bar_result_count] = U16_ADC_ResultBuffer;								//
		if ((++u8_handle_bar_result_count)>4)																									//转把缓存有5个字节
		{
			u8_handle_bar_result_count = 0;		
			HandleBarSampleFinishFlag = TRUE;																										//		
		}
#endif 				
//取本次电压的1/8与上次电压的7/8的和作为本次的电压值，这样可以减少电压尖峰对电压采样值的
//影响，		
		u16_handle_bar_voltage_buffer = U16_ADC_ResultBuffer;																	//
		U16_HandelbarVoltage = ((U16_HandelbarVoltage+u16_handle_bar_voltage_buffer*7)>>3);
		
		u8_sample_channel_index++;
		SAMPLE_ACC_VOLTAGE();																																	//下一次结果为电门锁电压	
	}
	else if (u8_sample_channel_index==1)																										//保存电门锁电压采样结果
	{
		U16_ACC_Voltage = U16_ADC_ResultBuffer;																								//
		u8_sample_channel_index++;
		SAMPLE_POWER_VOLTAGE();																																//下一次结果为电池电压
	}
	else if (u8_sample_channel_index==2)																										//保存电池电压采样结果
	{
		U16_PowerVoltage = U16_ADC_ResultBuffer;																							//
		u8_sample_channel_index = 0;
		SAMPLE_HANDELBAR();																																		//下一次结果为转把电压
	}
	else																																										//如果是非法值就转为转把通道重新采样
	{
		u8_sample_channel_index = 0;
		SAMPLE_HANDELBAR();																																		//下一次结果为转把电压
	}
	
	START_AD();																																							//开始转换
 }
 
 /**************************************************************************
 * 函数名		：BatteryVoltageCalculate()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2017-09-15
 * 函数描述 ：电池电压计算
 *************************************************************************/	
 unsigned int BatteryVoltageCalculate(void)
 {
		unsigned char									u8_voltage_offset_absolute = 0;
		static unsigned char					u8_voltage_change_delay = 0;														//
		static unsigned int						u16_power_voltage_temp = 0;
		
		
		u8_voltage_change_delay++;
		if (u8_voltage_change_delay>2)																												//2个调用周期转换一次电压值
		{
			u8_voltage_change_delay = 0;
			u16_power_voltage_temp = ((u16_power_voltage_temp+U16_PowerVoltage)>>1);						//得到上次和本次的平均值
			u16_power_voltage_temp = u16_power_voltage_temp+U8_VoltageOffset;										//平均值加上偏移量
			
			if (u16_power_voltage_temp>=VOLTAGE_OFFSET_CENTER_POINT)														//补偿后的电压值不能小于偏移量中点基准值，如果小做减法会是结果错误
				u16_power_voltage_temp -= VOLTAGE_OFFSET_CENTER_POINT;														//减去偏移量中点值得到转换值加上绝对偏移量
			else																																								//补偿后的值如果值小于基准中心值就认为电压为0
				u16_power_voltage_temp = 0;																												//
					
			u16_power_voltage_temp = u16_power_voltage_temp*VOLTAGE_PORTION;										//转换成实际电压

//----------------------------------------------------------------------------------------//		
//电池电量格数计算	
			if (u16_power_voltage_temp<U16_LowVoltageValue)																			//低于欠压值
			{
				U8_BatteryCellNumber = 0;																													//电池电量格数为0
			}
			else																																								//大于欠压值就判断需要亮几个电量格
			{
				U8_BatteryCellNumber = u16_power_voltage_temp - U16_LowVoltageValue;								//得到绝对电压值
				U8_BatteryCellNumber = (U8_BatteryCellNumber/U8_BatteryCellVoltage);							//得到要显示的电量格数
				
			}
//----------------------------------------------------------------------------------------//			
		}
		
		return (u16_power_voltage_temp);																											//
 }
 
 /**************************************************************************
 * 函数名		：HandleBarVoltageCalculate()
 * 输入参数 ：无
 * 输出参数 ：无
 * 返回值  	：无
 * 修改时间 ：2017-09-15
 * 函数描述 ：转把电压计算，转把上电做5次检测，如果5次都正常就退出上电检测，如果不正常就
 *						一直在上电检测中，检测次数可以按实际调整，但最少不能小于2,因为转把滤波用了
 *						前一次和本次的的转把值做了计算。
 *************************************************************************/	
 void HandleBarVoltageCalculate(unsigned int u16_handle_bar_voltage_buffer)
 {
		static unsigned char					u8_power_on_handle_check = 0;
		//static unsigned int						qq = 0;

	//	if (HandleBarSampleFinishFlag)																												
		{
			if (u8_power_on_handle_check>POWER_ON_CHECK_HANDLE_BAR_COUNT)												//工作中动态检测转把,上电转把检测次数最小不能小于2
			{
				if ((u16_handle_bar_voltage_buffer<HANDLE_BAR_LOW_LIM_V)||(u16_handle_bar_voltage_buffer>HANDLE_BAR_OVERFLOW_LIM_V))//转把电压不在正常范围说明转把故障
				{
					HandleBarErrorFlag = TRUE;
					ControllerWorkStateFlag = FALSE;																									//控制器不工作
					U16_HandleTo_PWM_Duty = 0;
				}
				else																																								//转把正常
				{
					HandleBarErrorFlag = FALSE;
					ControllerWorkStateFlag = TRUE;																										//控制器工作	
					
					if (u16_handle_bar_voltage_buffer>HANDLE_BAR_START_LIM_V)													//转把动作
						u16_handle_bar_voltage_buffer -= HANDLE_BAR_START_LIM_V;												//去除本底电压，得到转把绝对增量值
					else
						u16_handle_bar_voltage_buffer = 0x00;																						//没转动转把
					
					u16_handle_bar_voltage_buffer = (u16_handle_bar_voltage_buffer<<3)+(u16_handle_bar_voltage_buffer<<1);	//因为最小PWM分辨率为0.1%，所以要扩大10倍
					if (U8_Gear_State==0x03)																													//高档PWM百分比
					{
						U16_HandleTo_PWM_Duty = u16_handle_bar_voltage_buffer/HANDLE_VOL_TO_100_DUTY_BASE;//得到当前PWM百分比
						if (U16_HandleTo_PWM_Duty>HIGH_GEAR_PWM_DUTY)
						{
							U16_HandleTo_PWM_Duty = HIGH_GEAR_PWM_DUTY;
						}
					}
					else if (U8_Gear_State==0x02)																											//中档PWM百分比
					{
						U16_HandleTo_PWM_Duty = u16_handle_bar_voltage_buffer/HANDLE_VOL_TO_70_DUTY_BASE;
						if (U16_HandleTo_PWM_Duty>MIDDLE_GEAR_PWM_DUTY)
						{
							U16_HandleTo_PWM_Duty = MIDDLE_GEAR_PWM_DUTY;
						}
					}
					else																																							//低档PWM百分比，只要不是高和中档都算低档
					{
						U16_HandleTo_PWM_Duty = u16_handle_bar_voltage_buffer/HANDLE_VOL_TO_40_DUTY_BASE;
						if (U16_HandleTo_PWM_Duty>LOW_GEAR_PWM_DUTY)
						{
							U16_HandleTo_PWM_Duty = LOW_GEAR_PWM_DUTY;
						}
					}
				}
			}
			else																																								//上电转把检测
			{
				u8_power_on_handle_check++;																												//上电转把做5次检测，如果5次都是正常的就退出上电检测
				if (u16_handle_bar_voltage_buffer>HANDLE_BAR_START_LIM_V)													//上电转把没有归零
				{
					HandleBarErrorFlag = TRUE;																											//置位转把故障标志
					ControllerWorkStateFlag = FALSE;																								//控制器不工作
					U16_HandleTo_PWM_Duty = 0;
					u8_power_on_handle_check = 0;																										//只要有一次不正常就清零重新检测直到5次检测都正常为止
				}
			}
		}
		
		//if ((u16_handle_bar_voltage_buffer>6000)&&(u16_handle_bar_voltage_buffer>qq))
		//{
			//qq = u16_handle_bar_voltage_buffer;
			//U16_OdographNumber = u16_handle_bar_voltage_buffer;
		//}
 }
 
/**********************SINOWEALTH_SH79F083A**********END OF FILE*************************/
